import { AxiosRequestConfig, AxiosPromise, AxiosResponse } from '../types'

import xhr from './xhr'
import { buildURL } from '../helpers/url'
import { flattenHeaders } from '../helpers/headers'
import transform from './transform'

/**
 * URL 的格式化
 * @param config 用户的传入的参数
 */
function transformURL(config: AxiosRequestConfig): string {
  const { url, params } = config
  // params 参数是拼接到 URL 上使用的
  return buildURL(url!, params)
}

function transformResponseData(res: AxiosResponse): AxiosResponse {
  res.data = transform(res.data, res.headers, res.config.transformResponse)
  return res
}

function processConfig(config: AxiosRequestConfig): void {
  config.url = transformURL(config)
  config.data = transform(config.data, config.headers, config.transformRequest)
  config.headers = flattenHeaders(config.headers, config.method!)
}

function throwIfCancellationRequested(config: AxiosRequestConfig): void {
  if (config.cancelToken) {
    config.cancelToken.throwIfRequested()
  }
}

export default function dispatchRequest(options: AxiosRequestConfig): AxiosPromise {
  console.log('用户输入的参数：', options)
  throwIfCancellationRequested(options)
  processConfig(options)
  return xhr(options).then(res => {
    // 尝对返回的数据转成对象给前端
    return transformResponseData(res)
  })
}

// import { AxiosRequestConfig, AxiosPromise, AxiosResponse } from '../types'

// import xhr from './xhr'
// import { buildURL } from '../helpers/url'
// import { transformRequest, transformResponse } from '../helpers/data'
// import { processHeaders, flattenHeaders } from '../helpers/headers'

// /**
//  * URL 的格式化
//  * @param config 用户的传入的参数
//  */
// function transformURL(config: AxiosRequestConfig): string {
//   const { url, params } = config
//   // params 参数是拼接到 URL 上使用的
//   return buildURL(url!, params)
// }

// /**
//  * 请求体参数的处理
//  * @param config
//  */
// function transformRequestData(config: AxiosRequestConfig): any {
//   return transformRequest(config.data)
// }

// /**
//  * 请求头类型的处理
//  * @param config
//  */
// function transformHeaders(config: AxiosRequestConfig): any {
//   const { headers = {}, data } = config
//   return processHeaders(headers, data)
// }

// function transformResponseData(res: AxiosResponse): AxiosResponse {
//   res.data = transformResponse(res.data)
//   return res
// }

// function processConfig(config: AxiosRequestConfig): void {
//   // setup 1: 处理 URL params 的参数
//   config.url = transformURL(config)
//   // setup 2: 先处理 headers，在处理 data
//   config.headers = transformHeaders(config)
//   // setup 2.1: 处理请求体 data 的参数
//   config.data = transformRequestData(config)

//   // setup 3: 再次处理 headers 参数
//   config.headers = flattenHeaders(config.headers, config.method!)
// }

// export default function dispatchRequest(options: AxiosRequestConfig): AxiosPromise {
//   console.log('用户输入的参数：', options)
//   processConfig(options)
//   return xhr(options).then(res => {
//     // 尝对返回的数据转成对象给前端
//     return transformResponseData(res)
//   })
// }
